package org.imagic.module.think;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 最近在我们的web项目中servlet需要频繁创建SimpleDateFormat这个对象，
 * 进行日期格式化。因为创建这个对象本身很费时的，
 * 而且我们也知道SimpleDateFormat本身不是线程安全的，
 * 也不能缓存一个共享的SimpleDateFormat实例，
 * 为此我们想到使用ThreadLocal来给每个线程缓存一个SimpleDateFormat实例，
 * 提高性能。同时因为每个Servlet会用到不同pattern的时间格式化类，
 * 所以我们对应每一种pattern生成了一个ThreadLocal实例。
 * User: Ruijie Date: 2016/11/23
 */
public class DateFormatFactory {

    private static final Map<DatePattern, ThreadLocal<DateFormat>> pattern2ThreadLocal;

    static {
        DatePattern[] patterns = DatePattern.values();
        int len = patterns.length;
        pattern2ThreadLocal = new HashMap<DatePattern, ThreadLocal<DateFormat>>(len);
        for (int i = 0; i < len; i++) {
            DatePattern datePattern = patterns[i];
            final String pattern = datePattern.pattern;
            pattern2ThreadLocal.put(datePattern, new ThreadLocal<DateFormat>() {
                @Override
                protected DateFormat initialValue() {
                    return new SimpleDateFormat(pattern);
                }
            });
        }
    }

    //获取datePattern
    public static DateFormat getDateFormat(DatePattern pattern) {
        ThreadLocal<DateFormat> threadDateFormat = pattern2ThreadLocal.get(pattern);
        return threadDateFormat.get();
    }
}
